package bachelor.view {
	import app.core.action.RotatableScalable;

	import fiducialTuioAS3.tuio.TouchEvent;

	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.net.URLRequest;

	/**
	 * @author Admin
	 */
	public class Pic extends RotatableScalable
	{
		
		
//////////////////////////////////////////////////////////////////////
/////// VARIABLES ////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

		private var _maskSize : int;
		private var _mask : MovieClip = new MovieClip();

		private var _id : int;
		private var _path : String;
		private var _xmlWidth : int; 
		private var _xmlHeight : int; 

		public static const PIC_FINGER_UP : String = "picFingerUp";
		public static const SINGLE_PIC_LOADED : String = "singlePicLoaded";
		
//////////////////////////////////////////////////////////////////////
/////// CONSTRUCTOR //////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
		public function Pic(p_path : String, p_maskSize : int, p_id : int) 
		{
			//trace("          Pic -> Constructor init...");
			
			_maskSize = p_maskSize; // Wird in Abhängigkeit des aktuellen Grids übergeben
			_id = p_id;
			_path = p_path;
			loadPic();
		}


//////////////////////////////////////////////////////////////////////
/////// METHODS //////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
		
		
/////// Bilddatei von HD laden /////////////////////////////////////////////////
		private function loadPic():void
		{
			//trace("          Pic -> loadPic() ...");
			var loader:Loader=new Loader();
			var req:URLRequest=new URLRequest(_path);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
			loader.load(req);
		}
		
		
/////// Bild in passender Größe auf Stage adden ////////////////////////////////
		private function onLoaderComplete(evt:Event):void
		{
//			trace("          Pic -> onLoaderComplete() ::: von Bild " + _id);
			
			var bitmap : Bitmap = evt.target.loader.content as Bitmap;
			/*
			 * Originale Bitmap-Größe speichern für spätere Maskenverwendung
			 */
			_xmlWidth  = bitmap.width;
			_xmlHeight = bitmap.height;
			/*
			 *  Nimm die kürzere Bitmap-Seite und scaliere sie passend auf das Gridraster
			 */						
			var _scaleFactor : Number = _maskSize / Math.min(bitmap.width, bitmap.height); 
			bitmap.width  = bitmap.width *  _scaleFactor;
			bitmap.height = bitmap.height * _scaleFactor;
			bitmap.smoothing = true;
			/*
			 * Bitmap-Mittelpunkt auf den Pic-Mittelpunkt schieben
			 */
			bitmap.x = (-1) * bitmap.width / 2;
			bitmap.y = (-1) * bitmap.height / 2;
				
			addMask();
			/*
			 * Wenn Bild geladen, Layer informieren
			 */
			bitmap.addEventListener(Event.ADDED, onAddedHandler);
			addChild(bitmap);
			/*
			 * Bei Berührung Maske auffahren und ggf. einblenden
			 */
			this.addEventListener(TouchEvent.MOUSE_DOWN, touchHandler);
			
		}
		
		
/////// Bild erstmalig maskieren ///////////////////////////////////////////////
		private function addMask() : void 
		{
			/*
			 * Quadratische Maske für Grid
			 */
			_mask.graphics.beginFill(0xFF0066, 1);
			_mask.graphics.drawRect(-_maskSize/2, -_maskSize / 2, _maskSize, _maskSize);
			_mask.graphics.endFill();
			
			this.mask = _mask;
			addChild(_mask);
		}
		
		
/////// TouchEvent-Handler /////////////////////////////////////////////////////
		private function touchHandler(evt : *) : void 
		{
			/*
			 * Bei Berührungen muss sich die Maske verändern (ein-/ausklappen)
			 */
			switch (evt.type)
			{
				case TouchEvent.MOUSE_DOWN:
//					trace("Pic -> touchHandler() MouseDOWN ...");
					_mask.width  = _xmlWidth;
					_mask.height = _xmlHeight;
					addEventListener(RotatableScalable.FINGER_UP, touchHandler);
					break;
				case RotatableScalable.FINGER_UP: 
//					trace("Pic -> touchHandler() FingerUP ...");
					removeEventListener(RotatableScalable.FINGER_UP, touchHandler);
					_mask.width  = _maskSize;
					_mask.height = _maskSize;
					/* 
					 * Country muss aktuelle XY-Position abfragen und reagieren
					 */
					dispatchEvent(new Event(PIC_FINGER_UP));
					break;
			}			
		}
		

		
/////// ID zurückgeben /////////////////////////////////////////////////////////		
		private function onAddedHandler( evt : Event) : void 
		{
			var addedBitmap : Bitmap = evt.target as Bitmap;
			addedBitmap.removeEventListener(Event.ADDED, onAddedHandler);
			/*
			 * Jedes geladene Bild muss im Country registriert werden, 
			 * damit festgestellt werden kann, wann alle Pics fertig sind.
			 */
			dispatchEvent(new Event(SINGLE_PIC_LOADED));
		}
		
		
/////// ID zurückgeben /////////////////////////////////////////////////////////
		/*
		 * Erstelltes Bookmark benötigt Informationen über den Bildpfad
		 */
		public function getPicID() : int 
		{
			return this._id;
		}
		
		
		
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
		
	}
}
